Frequencies

1. Tokens

Term frequency

tokens %>%
  arrange(desc(n)) %>%
  mutate(word = factor(word, levels = rev(unique(word)))) %>% 
  group_by(party) %>% 
  top_n(15, n) %>% 
  ungroup() %>%
  ggplot(aes(word, n, fill = party)) +
  geom_col(show.legend = FALSE) +
  labs(x = NULL, y = "term frequency") +
  facet_wrap(~party, ncol = 2, scales = "free") +
  coord_flip()

Term frequency - inverse document frequency

tokens %>%
  arrange(desc(tf_idf)) %>%
  mutate(word = factor(word, levels = rev(unique(word)))) %>% 
  group_by(party) %>% 
  top_n(15, tf_idf) %>% 
  ungroup() %>%
  ggplot(aes(word, tf_idf, fill = party)) +
  geom_col(show.legend = FALSE) +
  labs(x = NULL, y = "tf-idf") +
  facet_wrap(~party, ncol = 2, scales = "free") +
  coord_flip()

2. Bigrams

bigrams <- df_collapsed %>%
  unnest_tokens(bigram, content, token = "ngrams", n=2) 
Fehler in stri_c(..., sep = sep, collapse = collapse, ignore_null = TRUE) : 
  argument `...` should be a character vector (or an object coercible to)

Text Netowrks

Netzwerkanalyse umfasst Methoden, die Beziehungen zwischen Einheiten beschreiben. Ein Netzwerk besteht aus Kanten sowie den Kanten (Verbindungen) zwischen den Einheiten. In einem sozialen Netzwerk z.B. sind diese Einheiten oft einzelne Personen, und Kanten beschreiben Freundschaften, Zugehörigkeiten oder andere Arten von sozialen Beziehungen.

Obwohl die Netzwerkanalyse am häufigsten zur Beschreibung von Beziehungen zwischen Menschen verwendet wird, gibt es einige Pioniere, die diese Methode zur Darstellung von Beziehungen zwischen Wörtern verwendeten. Zum Beispiel kann man einen Korpus von Dokumenten als ein Netzwerk darstellen, in dem jeder Knoten ein Dokument ist, und die Dicke oder Stärke der Kanten zwischen ihnen beschreibt Ähnlichkeiten zwischen den Wörtern, die in zwei beliebigen Dokumenten verwendet werden. Oder man kann ein Textnetzwerk erstellen, in dem einzelne Wörter die Knoten sind, und die Kanten zwischen ihnen beschreiben die Regelmäßigkeit, mit der sie in Dokumenten zusammenkommen.

Eine sehr gute Einführung in das Thema und die hier verwendete Library textnets gibt es hier.

CDU

SPD

x
[1] "SPD.pdf"

B90/ Die Grünen

x
[1] "Gruene.pdf"

FDP

x <- file_names[4]
x

DIE LINKE

x
[1] "DIE_LINKE.pdf"

AFD

x
[1] "DIE_LINKE.pdf"

LS0tCnRpdGxlOiAiTmV0endlcmthbmFseXNlIGRlciBXYWhscHJvZ3JhbW1lIGRldXRzY2hlciBQYXJ0ZWllbiB6dXIgRXVyb3Bhd2FobCAyMDE5IgphdXRob3I6ICJGcmFuemlza2EgTMO2dyIKZGF0ZTogImByIGZvcm1hdChTeXMuRGF0ZSgpKWAiCm91dHB1dDoKICBodG1sX25vdGVib29rOgogICAgY29kZV9mb2xkaW5nOiBoaWRlCi0tLQoKYGBge3IgaW5jbHVkZT1GQUxTRX0KI2luc3RhbGwucGFja2FnZXMoInBkZnRvb2xzIikKbGlicmFyeShkZXZ0b29scykKI2luc3RhbGxfZ2l0aHViKCJjYmFpbC90ZXh0bmV0cyIsIGZvcmNlPVRSVUUpCmxpYnJhcnkodGV4dG5ldHMpCgpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeSh0aWR5dGV4dCkKbGlicmFyeSh0bSkKbGlicmFyeShkYXRhLnRhYmxlKQpgYGAKCmBgYHtyfQpybShsaXN0PWxzKCkpCgojIGltcG9ydCBkYXRhCnBhdGggPSAiLi4vcGRmLyIKZmlsZV9uYW1lcyA9IGxpc3QuZmlsZXMocGF0aCwgcGF0dGVybiA9ICIqLnBkZiIpIAoKZGYgPC0gZG8uY2FsbChyYmluZCwgbGFwcGx5KGZpbGVfbmFtZXMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oeCkgY2JpbmQoYXMuZGF0YS5mcmFtZShwZGZ0b29sczo6cGRmX3RleHQocGFzdGUwKHBhdGgsIHgpKSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydHk9c3Ryc3BsaXQoeCwnXFwuJylbWzFdXVsxXSkpKQoKbmFtZXMoZGYpIDwtIGMoInRleHQiLCJwYXJ0eSIpCiMgZGVmaW5lIHN0b3B3b3JkcwpzdG9wd29yZHMgPC0gdG06OnN0b3B3b3JkcyhraW5kID0gImdlcm1hbiIpCnN0b3B3b3JkcyA8LSBjKHN0b3B3b3JkcywgImRhc3MiLCAic293aWUiLCAibcO8c3NlbiIsICJ3ZXIiLCAiaW5uZW4iLCAiYWIiLCAibWVociIsICJzZWl0IiwgImRhZsO8ciIpCmBgYAoKIyBGcmVxdWVuY2llcwoKYGBge3J9CmRmX2NvbGxhcHNlZCA8LSBkZiAlPiUgZ3JvdXBfYnkocGFydHkpICU+JSBzdW1tYXJpc2UodGV4dCA9IHBhc3RlKHRleHQsIGNvbGxhcHNlID0gIiAiKSkKYGBgCgojIyAxLiBUb2tlbnMKYGBge3J9CnRva2VucyA8LSBkZl9jb2xsYXBzZWQgJT4lCiAgdW5uZXN0X3Rva2Vucyh3b3JkLCB0ZXh0KSAlPiUKICBjb3VudChwYXJ0eSwgd29yZCwgc29ydD1UUlVFKSAlPiUKICBmaWx0ZXIoIXdvcmQgJWluJSBzdG9wd29yZHMpICU+JQogIGJpbmRfdGZfaWRmKHdvcmQsIHBhcnR5LCBuKQpgYGAKCiMjIyBUZXJtIGZyZXF1ZW5jeQoKYGBge3IgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTh9CnRva2VucyAlPiUKICBhcnJhbmdlKGRlc2MobikpICU+JQogIG11dGF0ZSh3b3JkID0gZmFjdG9yKHdvcmQsIGxldmVscyA9IHJldih1bmlxdWUod29yZCkpKSkgJT4lIAogIGdyb3VwX2J5KHBhcnR5KSAlPiUgCiAgdG9wX24oMTUsIG4pICU+JSAKICB1bmdyb3VwKCkgJT4lCiAgZ2dwbG90KGFlcyh3b3JkLCBuLCBmaWxsID0gcGFydHkpKSArCiAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSAidGVybSBmcmVxdWVuY3kiKSArCiAgZmFjZXRfd3JhcCh+cGFydHksIG5jb2wgPSAyLCBzY2FsZXMgPSAiZnJlZSIpICsKICBjb29yZF9mbGlwKCkKYGBgCgojIyMgVGVybSBmcmVxdWVuY3kgLSBpbnZlcnNlIGRvY3VtZW50IGZyZXF1ZW5jeQoKYGBge3IgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTh9CnRva2VucyAlPiUKICBhcnJhbmdlKGRlc2ModGZfaWRmKSkgJT4lCiAgbXV0YXRlKHdvcmQgPSBmYWN0b3Iod29yZCwgbGV2ZWxzID0gcmV2KHVuaXF1ZSh3b3JkKSkpKSAlPiUgCiAgZ3JvdXBfYnkocGFydHkpICU+JSAKICB0b3BfbigxNSwgdGZfaWRmKSAlPiUgCiAgdW5ncm91cCgpICU+JQogIGdncGxvdChhZXMod29yZCwgdGZfaWRmLCBmaWxsID0gcGFydHkpKSArCiAgZ2VvbV9jb2woc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwogIGxhYnMoeCA9IE5VTEwsIHkgPSAidGYtaWRmIikgKwogIGZhY2V0X3dyYXAofnBhcnR5LCBuY29sID0gMiwgc2NhbGVzID0gImZyZWUiKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKIyMgMi4gQmlncmFtcyAKYGBge3J9CmJpZ3JhbXMgPC0gZGZfY29sbGFwc2VkICU+JQogIHVubmVzdF90b2tlbnMoYmlncmFtLCB0ZXh0LCB0b2tlbiA9ICJuZ3JhbXMiLCBuPTIpIAoKYmlncmFtcyA8LSBiaWdyYW1zICU+JSAKICBzZXBhcmF0ZShiaWdyYW0sIGMoIndvcmQxIiwgIndvcmQyIiksIHNlcD0iICIpICU+JQogIGZpbHRlcighd29yZDEgJWluJSBzdG9wd29yZHMpICU+JQogIGZpbHRlcighd29yZDIgJWluJSBzdG9wd29yZHMpICU+JQogIGNvdW50KHdvcmQxLCB3b3JkMiwgcGFydHksIHNvcnQ9VFJVRSkgJT4lCiAgdW5pdGUoYmlncmFtLCB3b3JkMSwgd29yZDIsIHNlcD0iICIpCmBgYAoKYGBge3IgZmlnLmhlaWdodD0xMCwgZmlnLndpZHRoPTh9CmJpZ3JhbXMgJT4lCiAgYXJyYW5nZShkZXNjKG4pKSAlPiUKICBtdXRhdGUod29yZCA9IGZhY3RvcihiaWdyYW0sIGxldmVscyA9IHJldih1bmlxdWUoYmlncmFtKSkpKSAlPiUgCiAgZ3JvdXBfYnkocGFydHkpICU+JSAKICB0b3BfbigxMCwgbikgJT4lIAogIHVuZ3JvdXAoKSAlPiUKICBnZ3Bsb3QoYWVzKHdvcmQsIG4sIGZpbGwgPSBwYXJ0eSkpICsKICBnZW9tX2NvbChzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgbGFicyh4ID0gTlVMTCwgeSA9ICJiaWdyYW0gZnJlcXVlbmN5IikgKwogIGZhY2V0X3dyYXAofnBhcnR5LCBuY29sID0gMiwgc2NhbGVzID0gImZyZWUiKSArCiAgY29vcmRfZmxpcCgpCmBgYAoKIyBUZXh0IE5ldG93cmtzCgpOZXR6d2Vya2FuYWx5c2UgdW1mYXNzdCBNZXRob2RlbiwgZGllIEJlemllaHVuZ2VuIHp3aXNjaGVuIEVpbmhlaXRlbiBiZXNjaHJlaWJlbi4gRWluIE5ldHp3ZXJrIGJlc3RlaHQgYXVzIEthbnRlbiBzb3dpZSBkZW4gS2FudGVuIChWZXJiaW5kdW5nZW4pIHp3aXNjaGVuIGRlbiBFaW5oZWl0ZW4uIEluIGVpbmVtIHNvemlhbGVuIE5ldHp3ZXJrIHouQi4gc2luZCBkaWVzZSBFaW5oZWl0ZW4gb2Z0IGVpbnplbG5lIFBlcnNvbmVuLCB1bmQgS2FudGVuIGJlc2NocmVpYmVuIEZyZXVuZHNjaGFmdGVuLCBadWdlaMO2cmlna2VpdGVuIG9kZXIgYW5kZXJlIEFydGVuIHZvbiBzb3ppYWxlbiBCZXppZWh1bmdlbi4gCgpPYndvaGwgZGllIE5ldHp3ZXJrYW5hbHlzZSBhbSBow6R1Zmlnc3RlbiB6dXIgQmVzY2hyZWlidW5nIHZvbiBCZXppZWh1bmdlbiB6d2lzY2hlbiBNZW5zY2hlbiB2ZXJ3ZW5kZXQgd2lyZCwgZ2lidCBlcyBlaW5pZ2UgUGlvbmllcmUsIGRpZSBkaWVzZSBNZXRob2RlIHp1ciBEYXJzdGVsbHVuZyB2b24gQmV6aWVodW5nZW4gendpc2NoZW4gV8O2cnRlcm4gdmVyd2VuZGV0ZW4uIFp1bSBCZWlzcGllbCBrYW5uIG1hbiBlaW5lbiBLb3JwdXMgdm9uIERva3VtZW50ZW4gYWxzIGVpbiBOZXR6d2VyayBkYXJzdGVsbGVuLCBpbiBkZW0gamVkZXIgS25vdGVuIGVpbiBEb2t1bWVudCBpc3QsIHVuZCBkaWUgRGlja2Ugb2RlciBTdMOkcmtlIGRlciBLYW50ZW4gendpc2NoZW4gaWhuZW4gYmVzY2hyZWlidCDDhGhubGljaGtlaXRlbiB6d2lzY2hlbiBkZW4gV8O2cnRlcm4sIGRpZSBpbiB6d2VpIGJlbGllYmlnZW4gRG9rdW1lbnRlbiB2ZXJ3ZW5kZXQgd2VyZGVuLiBPZGVyIG1hbiBrYW5uIGVpbiBUZXh0bmV0endlcmsgZXJzdGVsbGVuLCBpbiBkZW0gZWluemVsbmUgV8O2cnRlciBkaWUgS25vdGVuIHNpbmQsIHVuZCBkaWUgS2FudGVuIHp3aXNjaGVuIGlobmVuIGJlc2NocmVpYmVuIGRpZSBSZWdlbG3DpMOfaWdrZWl0LCBtaXQgZGVyIHNpZSBpbiBEb2t1bWVudGVuIHp1c2FtbWVua29tbWVuLgoKRWluZSBzZWhyIGd1dGUgRWluZsO8aHJ1bmcgaW4gZGFzIFRoZW1hIHVuZCBkaWUgaGllciB2ZXJ3ZW5kZXRlIExpYnJhcnkgW3RleHRuZXRzXShodHRwczovL2dpdGh1Yi5jb20vY2JhaWwvdGV4dG5ldHMpIGdpYnQgZXMgW2hpZXJdKGh0dHBzOi8vY2JhaWwuZ2l0aHViLmlvL1NJQ1NTX1RleHRfTmV0d29ya3MuaHRtbCkuCgojIyBDRFUKYGBge3J9CnggPC0gZmlsZV9uYW1lc1syXQp4CmBgYAoKYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KIyBsb2FkIHRleHQKZGZfc20gPC0gYXMuZGF0YS5mcmFtZShwZGZ0b29sczo6cGRmX3RleHQocGFzdGUwKHBhdGgsIHgpKSkKZGZfc20kcGFnZSA8LSByb3duYW1lcyhkZl9zbSkKbmFtZXMoZGZfc20pIDwtIGMoInRleHQiLCJwYWdlIikKZGZfc20kdGV4dCA8LSBhcy5jaGFyYWN0ZXIoZGZfc20kdGV4dCkKCnJlcG9ydF9kZiA8LSBQcmVwVGV4dChkZl9zbSwKICAgICAgICAgICAgICAgIHRleHR2YXIgPSAidGV4dCIsCiAgICAgICAgICAgICAgICBncm91cHZhcj0icGFnZSIsCiAgICAgICAgICAgICAgICBub2RlX3R5cGU9IndvcmRzIiwKICAgICAgICAgICAgICAgIHRva2VuaXplciA9ICJ3b3JkcyIsCiAgICAgICAgICAgICAgICBwb3MgPSAibm91bnMiLAogICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSAiZ2VybWFuIiwKICAgICAgICAgICAgICAgIHJlbW92ZV9zdG9wX3dvcmRzID0gVFJVRSwKICAgICAgICAgICAgICAgIGNvbXBvdW5kX25vdW5zID0gVFJVRSkKCnNhdmUocmVwb3J0X2RmLCBmaWxlPXBhc3RlMCgiLi4vb3V0L3JlcG9ydF9kZiIsZ3N1YigiLnBkZiIsIiIseCksIi5SZGEiKSkKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9MTIsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxvYWQocGFzdGUwKCIuLi9vdXQvcmVwb3J0X2RmIixnc3ViKCIucGRmIiwiIix4KSwiLlJkYSIpKQoKb3V0IDwtIHJlcG9ydF9kZiAlPiUgCiAgZmlsdGVyKCFncmVwbCgiW1s6cHVuY3Q6XV0iLCBsZW1tYSkpICU+JQogIGZpbHRlcighZ3JlcGwoIltbOmNudHJsOl1dIiwgbGVtbWEpKSAlPiUKICBmaWx0ZXIoIWdyZXBsKCJbWzpkaWdpdDpdXSIsIGxlbW1hKSkgJT4lCiAgZmlsdGVyKCEoZ3JlcGwoIlxcVyIsIGxlbW1hKSAmIG5jaGFyKGxlbW1hKSA9PTEpKSAlPiUKICBmaWx0ZXIobmNoYXIobGVtbWEpID4gMSkgCgpyZXBvcnRfbmV0d29yayA8LSBDcmVhdGVUZXh0bmV0KG91dCkKClZpc1RleHROZXQocmVwb3J0X25ldHdvcmssIGxhYmVsX2RlZ3JlZV9jdXQgPSAwLCBhbHBoYT0uMSkKYGBgCgojIyBTUEQKYGBge3J9CnggPC0gZmlsZV9uYW1lc1s2XQp4CmBgYAoKYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KZGZfc20gPC0gYXMuZGF0YS5mcmFtZShwZGZ0b29sczo6cGRmX3RleHQocGFzdGUwKHBhdGgsIHgpKSkKZGZfc20kcGFnZSA8LSByb3duYW1lcyhkZl9zbSkKbmFtZXMoZGZfc20pIDwtIGMoInRleHQiLCJwYWdlIikKZGZfc20kdGV4dCA8LSBhcy5jaGFyYWN0ZXIoZGZfc20kdGV4dCkKCnJlcG9ydF9kZiA8LSBQcmVwVGV4dChkZl9zbSwKICAgICAgICAgICAgICAgIHRleHR2YXIgPSAidGV4dCIsCiAgICAgICAgICAgICAgICBncm91cHZhcj0icGFnZSIsCiAgICAgICAgICAgICAgICBub2RlX3R5cGU9IndvcmRzIiwKICAgICAgICAgICAgICAgIHRva2VuaXplciA9ICJ3b3JkcyIsCiAgICAgICAgICAgICAgICBwb3MgPSAibm91bnMiLAogICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSAiZ2VybWFuIiwKICAgICAgICAgICAgICAgIHJlbW92ZV9zdG9wX3dvcmRzID0gVFJVRSwKICAgICAgICAgICAgICAgIGNvbXBvdW5kX25vdW5zID0gVFJVRSkKCnNhdmUocmVwb3J0X2RmLCBmaWxlPXBhc3RlMCgiLi4vb3V0L3JlcG9ydF9kZiIsZ3N1YigiLnBkZiIsIiIseCksIi5SZGEiKSkKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9MTIsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxvYWQocGFzdGUwKCIuLi9vdXQvcmVwb3J0X2RmIixnc3ViKCIucGRmIiwiIix4KSwiLlJkYSIpKQoKb3V0IDwtIHJlcG9ydF9kZiAlPiUgCiAgZmlsdGVyKCFncmVwbCgiW1s6cHVuY3Q6XV0iLCBsZW1tYSkpICU+JQogIGZpbHRlcighZ3JlcGwoIltbOmNudHJsOl1dIiwgbGVtbWEpKSAlPiUKICBmaWx0ZXIoIWdyZXBsKCJbWzpkaWdpdDpdXSIsIGxlbW1hKSkgJT4lCiAgICBmaWx0ZXIoIShncmVwbCgiXFxXIiwgbGVtbWEpICYgbmNoYXIobGVtbWEpID09MSkpICU+JQogIGZpbHRlcihuY2hhcihsZW1tYSkgPiAxKSAKCnJlcG9ydF9uZXR3b3JrIDwtIENyZWF0ZVRleHRuZXQob3V0KQoKVmlzVGV4dE5ldChyZXBvcnRfbmV0d29yaywgbGFiZWxfZGVncmVlX2N1dCA9IDEsIGFscGhhPS4xKQpgYGAKCiMjIEI5MC8gRGllIEdyw7xuZW4KYGBge3J9CnggPC0gZmlsZV9uYW1lc1s1XQp4CmBgYAoKYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KZGZfc20gPC0gYXMuZGF0YS5mcmFtZShwZGZ0b29sczo6cGRmX3RleHQocGFzdGUwKHBhdGgsIHgpKSkKZGZfc20kcGFnZSA8LSByb3duYW1lcyhkZl9zbSkKbmFtZXMoZGZfc20pIDwtIGMoInRleHQiLCJwYWdlIikKZGZfc20kdGV4dCA8LSBhcy5jaGFyYWN0ZXIoZGZfc20kdGV4dCkKCnJlcG9ydF9kZiA8LSBQcmVwVGV4dChkZl9zbSwKICAgICAgICAgICAgICAgIHRleHR2YXIgPSAidGV4dCIsCiAgICAgICAgICAgICAgICBncm91cHZhcj0icGFnZSIsCiAgICAgICAgICAgICAgICBub2RlX3R5cGU9IndvcmRzIiwKICAgICAgICAgICAgICAgIHRva2VuaXplciA9ICJ3b3JkcyIsCiAgICAgICAgICAgICAgICBwb3MgPSAibm91bnMiLAogICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSAiZ2VybWFuIiwKICAgICAgICAgICAgICAgIHJlbW92ZV9zdG9wX3dvcmRzID0gVFJVRSwKICAgICAgICAgICAgICAgIGNvbXBvdW5kX25vdW5zID0gVFJVRSkKCnNhdmUocmVwb3J0X2RmLCBmaWxlPXBhc3RlMCgiLi4vb3V0L3JlcG9ydF9kZiIsZ3N1YigiLnBkZiIsIiIseCksIi5SZGEiKSkKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9MTIsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxvYWQocGFzdGUwKCIuLi9vdXQvcmVwb3J0X2RmIixnc3ViKCIucGRmIiwiIix4KSwiLlJkYSIpKQoKb3V0IDwtIHJlcG9ydF9kZiAlPiUgCiAgZmlsdGVyKCFncmVwbCgiW1s6cHVuY3Q6XV0iLCBsZW1tYSkpICU+JQogIGZpbHRlcighZ3JlcGwoIltbOmNudHJsOl1dIiwgbGVtbWEpKSAlPiUKICBmaWx0ZXIoIWdyZXBsKCJbWzpkaWdpdDpdXSIsIGxlbW1hKSkgJT4lCiAgICBmaWx0ZXIoIShncmVwbCgiXFxXIiwgbGVtbWEpICYgbmNoYXIobGVtbWEpID09MSkpICU+JQogIGZpbHRlcihuY2hhcihsZW1tYSkgPiAxKQoKcmVwb3J0X25ldHdvcmsgPC0gQ3JlYXRlVGV4dG5ldChvdXQpCgpWaXNUZXh0TmV0KHJlcG9ydF9uZXR3b3JrLCBsYWJlbF9kZWdyZWVfY3V0ID0gMTAsIGFscGhhPS4wOSkKYGBgCgojIyBGRFAKYGBge3J9CnggPC0gZmlsZV9uYW1lc1s0XQp4CmBgYAoKYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KZGZfc20gPC0gYXMuZGF0YS5mcmFtZShwZGZ0b29sczo6cGRmX3RleHQocGFzdGUwKHBhdGgsIHgpKSkKZGZfc20kcGFnZSA8LSByb3duYW1lcyhkZl9zbSkKbmFtZXMoZGZfc20pIDwtIGMoInRleHQiLCJwYWdlIikKZGZfc20kdGV4dCA8LSBhcy5jaGFyYWN0ZXIoZGZfc20kdGV4dCkKCnJlcG9ydF9kZiA8LSBQcmVwVGV4dChkZl9zbSwKICAgICAgICAgICAgICAgIHRleHR2YXIgPSAidGV4dCIsCiAgICAgICAgICAgICAgICBncm91cHZhcj0icGFnZSIsCiAgICAgICAgICAgICAgICBub2RlX3R5cGU9IndvcmRzIiwKICAgICAgICAgICAgICAgIHRva2VuaXplciA9ICJ3b3JkcyIsCiAgICAgICAgICAgICAgICBwb3MgPSAibm91bnMiLAogICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSAiZ2VybWFuIiwKICAgICAgICAgICAgICAgIHJlbW92ZV9zdG9wX3dvcmRzID0gVFJVRSwKICAgICAgICAgICAgICAgIGNvbXBvdW5kX25vdW5zID0gVFJVRSkKCnNhdmUocmVwb3J0X2RmLCBmaWxlPXBhc3RlMCgiLi4vb3V0L3JlcG9ydF9kZiIsZ3N1YigiLnBkZiIsIiIseCksIi5SZGEiKSkKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9MTIsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxvYWQocGFzdGUwKCIuLi9vdXQvcmVwb3J0X2RmIixnc3ViKCIucGRmIiwiIix4KSwiLlJkYSIpKQoKb3V0IDwtIHJlcG9ydF9kZiAlPiUgCiAgZmlsdGVyKCFncmVwbCgiW1s6cHVuY3Q6XV0iLCBsZW1tYSkpICU+JQogIGZpbHRlcighZ3JlcGwoIltbOmNudHJsOl1dIiwgbGVtbWEpKSAlPiUKICBmaWx0ZXIoIWdyZXBsKCJbWzpkaWdpdDpdXSIsIGxlbW1hKSkgJT4lCiAgZmlsdGVyKG5jaGFyKGxlbW1hKSA+IDEpIAoKcmVwb3J0X25ldHdvcmsgPC0gQ3JlYXRlVGV4dG5ldChvdXQpCgpWaXNUZXh0TmV0KHJlcG9ydF9uZXR3b3JrLCBsYWJlbF9kZWdyZWVfY3V0ID0gMTAsIGFscGhhPS4xKQpgYGAKCiMjIERJRSBMSU5LRQpgYGB7cn0KeCA8LSBmaWxlX25hbWVzWzNdCngKYGBgCgpgYGB7ciBldmFsPUZBTFNFLCBpbmNsdWRlPUZBTFNFfQpkZl9zbSA8LSBhcy5kYXRhLmZyYW1lKHBkZnRvb2xzOjpwZGZfdGV4dChwYXN0ZTAocGF0aCwgeCkpKQpkZl9zbSRwYWdlIDwtIHJvd25hbWVzKGRmX3NtKQpuYW1lcyhkZl9zbSkgPC0gYygidGV4dCIsInBhZ2UiKQpkZl9zbSR0ZXh0IDwtIGFzLmNoYXJhY3RlcihkZl9zbSR0ZXh0KQoKcmVwb3J0X2RmIDwtIFByZXBUZXh0KGRmX3NtLAogICAgICAgICAgICAgICAgdGV4dHZhciA9ICJ0ZXh0IiwKICAgICAgICAgICAgICAgIGdyb3VwdmFyPSJwYWdlIiwKICAgICAgICAgICAgICAgIG5vZGVfdHlwZT0id29yZHMiLAogICAgICAgICAgICAgICAgdG9rZW5pemVyID0gIndvcmRzIiwKICAgICAgICAgICAgICAgIHBvcyA9ICJub3VucyIsCiAgICAgICAgICAgICAgICBsYW5ndWFnZSA9ICJnZXJtYW4iLAogICAgICAgICAgICAgICAgcmVtb3ZlX3N0b3Bfd29yZHMgPSBUUlVFLAogICAgICAgICAgICAgICAgY29tcG91bmRfbm91bnMgPSBUUlVFKQoKc2F2ZShyZXBvcnRfZGYsIGZpbGU9cGFzdGUwKCIuLi9vdXQvcmVwb3J0X2RmIixnc3ViKCIucGRmIiwiIix4KSwiLlJkYSIpKQpgYGAKCmBgYHtyIGVjaG89RkFMU0UsIGZpZy5oZWlnaHQ9MTIsIGZpZy53aWR0aD0xMiwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbG9hZChwYXN0ZTAoIi4uL291dC9yZXBvcnRfZGYiLGdzdWIoIi5wZGYiLCIiLHgpLCIuUmRhIikpCgpvdXQgPC0gcmVwb3J0X2RmICU+JSAKICBmaWx0ZXIoIWdyZXBsKCJbWzpwdW5jdDpdXSIsIGxlbW1hKSkgJT4lCiAgZmlsdGVyKCFncmVwbCgiW1s6Y250cmw6XV0iLCBsZW1tYSkpICU+JQogIGZpbHRlcighZ3JlcGwoIltbOmRpZ2l0Ol1dIiwgbGVtbWEpKSAlPiUKICBmaWx0ZXIobmNoYXIobGVtbWEpID4gMSkgCgpyZXBvcnRfbmV0d29yayA8LSBDcmVhdGVUZXh0bmV0KG91dCkKClZpc1RleHROZXQocmVwb3J0X25ldHdvcmssIGxhYmVsX2RlZ3JlZV9jdXQgPSAxOCwgYWxwaGE9LjEyKQpgYGAKCiMjIEFGRAoKYGBge3J9CnggPC0gZmlsZV9uYW1lc1sxXQp4CmBgYAoKYGBge3IgZXZhbD1GQUxTRSwgaW5jbHVkZT1GQUxTRX0KZGZfc20gPC0gYXMuZGF0YS5mcmFtZShwZGZ0b29sczo6cGRmX3RleHQocGFzdGUwKHBhdGgsIHgpKSkKZGZfc20kcGFnZSA8LSByb3duYW1lcyhkZl9zbSkKbmFtZXMoZGZfc20pIDwtIGMoInRleHQiLCJwYWdlIikKZGZfc20kdGV4dCA8LSBhcy5jaGFyYWN0ZXIoZGZfc20kdGV4dCkKCnJlcG9ydF9kZiA8LSBQcmVwVGV4dChkZl9zbSwKICAgICAgICAgICAgICAgIHRleHR2YXIgPSAidGV4dCIsCiAgICAgICAgICAgICAgICBncm91cHZhcj0icGFnZSIsCiAgICAgICAgICAgICAgICBub2RlX3R5cGU9IndvcmRzIiwKICAgICAgICAgICAgICAgIHRva2VuaXplciA9ICJ3b3JkcyIsCiAgICAgICAgICAgICAgICBwb3MgPSAibm91bnMiLAogICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSAiZ2VybWFuIiwKICAgICAgICAgICAgICAgIHJlbW92ZV9zdG9wX3dvcmRzID0gVFJVRSwKICAgICAgICAgICAgICAgIGNvbXBvdW5kX25vdW5zID0gVFJVRSkKCnNhdmUocmVwb3J0X2RmLCBmaWxlPXBhc3RlMCgiLi4vb3V0L3JlcG9ydF9kZiIsZ3N1YigiLnBkZiIsIiIseCksIi5SZGEiKSkKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBmaWcuaGVpZ2h0PTEyLCBmaWcud2lkdGg9MTIsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxvYWQocGFzdGUwKCIuLi9vdXQvcmVwb3J0X2RmIixnc3ViKCIucGRmIiwiIix4KSwiLlJkYSIpKQoKb3V0IDwtIHJlcG9ydF9kZiAlPiUgCiAgZmlsdGVyKCFncmVwbCgiW1s6cHVuY3Q6XV0iLCBsZW1tYSkpICU+JQogIGZpbHRlcighZ3JlcGwoIltbOmNudHJsOl1dIiwgbGVtbWEpKSAlPiUKICBmaWx0ZXIoIWdyZXBsKCJbWzpkaWdpdDpdXSIsIGxlbW1hKSkgJT4lCiAgZmlsdGVyKG5jaGFyKGxlbW1hKSA+IDEpIAoKcmVwb3J0X25ldHdvcmsgPC0gQ3JlYXRlVGV4dG5ldChvdXQpCgpWaXNUZXh0TmV0KHJlcG9ydF9uZXR3b3JrLCBsYWJlbF9kZWdyZWVfY3V0ID0gMiwgYWxwaGEgPSAuMSkKYGBgCgo=